Periferiche di Memorizzazione 您所在的位置:网站首页 periferiche di memorizzazione Periferiche di Memorizzazione

Periferiche di Memorizzazione

#Periferiche di Memorizzazione| 来源: 网络整理| 查看: 265

La categoria dei microcontrollori, di solito non dispone internamente di grandi quantità di memoria per il salvataggio permanente delle variabili. Apparentemente questo può sembrare un ostacolo, soprattutto in applicazioni, come nel caso in esame in cui è necessario caricare o salvare in runtime i segnali campione. I quali dovranno rendersi disponibili senza essere ricaricati su successive misurazioni, anche casi in cui venga tolta l’alimentazione.

L’utilizzo di una eeprom esterna è sicuramente la scelta migliore, anche se la Microchip ha approntato una libreria che permette di emulare nel microcontrollore il funzionamento di una eeprom, sfruttando la memoria programma. Sebbene entrambe le possibilità siano state valutate , si è deciso di sfruttare una memoria flash esterna, già implementata sulla demoboard del PIC , la quale comunica con il microcontrollore attraverso una interfaccia SPI(Cap. 4.1).

4.1 Interfaccia SPI

La comunicazione SPI (Serial Peripheral Interface) è una tra le più semplici ed efficaci. L’interfaccia SPI descrive una comunicazione Master Slave (fig.4.1), di tipo sincrono e full-duplex. Il clock viene trasmesso con linea dedicata ed è possibile la ricetrasmissione dei dati.

fig. 4.1: Connessione tra Master e Slave mettendo in evidenza i registri a scorrimento interni.

Il modulo di un microcontrollore che implementa l’interfaccia SPI può essere rappresentato come uno Shift Register; analizzeremo per maggiore chiarezza il metodo di trasmissione di un byte. Prima di avviare una comunicazione, il Master attiva la linea CS relativa allo Slave con cui vuole effettuare la comunicazione e successivamente il clock alla frequenza con cui avverrà la trasmissione. Dopo l’attivazione dello Slave, i bit interni al registro a scorrimento del Master vengono trasmessi all’esterno in sequenza ad ogni fronte di CK positivo, solitamente a partire dal bit più significativo. Il bit traslato entra nel registro dello Slave, il quale a sua volta inizia a svuotare

il proprio registro inviando il bit più significativo attraverso la linea SDI. La comunicazione termina

quando l’ultimo bit del registro viene trasmesso.

Si nota che quanto descritto non è riferito ad un particolare tipo di formattazione. Il byte trasmesso è una semplice sequenza di bit, il cui significato dipenderà dall’applicazione.

fig. 4.2: Sequenza di comunicazione SPI

Per permettere la comunicazione con la memoria flash, risulta necessario abilitare la connessione che sfrutta il protocollo SPI, come riportato in [12]. Mediante la funzione:

OpenSPI (conf1, conf2, conf3);

I valori che vengono assegnati alla funzione permettono la configurazione di tre registri necessari per il setting della porta SPI, nello specifico:

- conf1: configura il registro SPI1CON1;

- conf2: configura il registro SPI1CON2;

4.2 – Comunicazione con la memoria

4.2.1 Flash memory

La flash memory, rientra nella tipologia di memorie non volatile a stato solido, per le sue caratteristiche può essere usata come memoria in lettura-scrittura. Esistono due famiglie principali di memorie flash, dette NOR e NAND flash [13], queste differiscono per l'architettura ed il processo di programmazione, entrambe permettono comunque una elevata velocità di comunicazione e una buona capacità di memorizzazione. Indipendentemente dalla tecnologia costruttiva le informazioni sono immagazzinate in un array di transistori MOS a floating gate (fig. 4.3).

fig. 4.3: Sezione schematica di un MOSFET floating gate (fonte: [14])

4.2.2 Implementazione Hardware

Di seguito verrà definita la struttura hardware implementata nella memoria, che deve essere preventivamente organizzata per poter realizzare il programma implementato nel PIC.

Viene fissata univocamente la massima estensione temporale delle grandezze riproducibili pari a 10 secondi, inoltre da quanto affermato nel Cap. 2.2.1 il segnale viene elaborato con una frequenza pari a 1 KHz; quindi viene univocamente stabilita la massima dimensione assunta dai campioni di una forma d'onda da riproducibile dal sistema, questa è pari a 10000 elementi e ad ogni campione (12bit) verrà associato uno spazio in memoria pari a due byte. Si è quindi deciso di creare una struttura per la gestione dei buffer in memoria flash, composta da 10 buffer di dimensione fissata

(fig. 4.5); divisi a loro volta internamente in 3 settori, che permettono di identificare il contenuto univocamente (fig. 4.6). La prima sezione composta da 2 Byte contiene la dimensione dei dati

salvati, la seconda contiene il nome del buffer, rappresentabile al massimo con 8 caratteri (8 Byte), infine sono memorizzati tutti i campioni relativi alla forma d'onda.

fig. 4.4: Indirizzamento dei buffer in memoria

Come si nota la dimensione dei buffer viene volutamente resa fissa nonostante il numero di campioni caratteristici per ogni dato sia variabile. Questa configurazione è ideale per evitare il ripristino totale dei dati in memoria ogni volta che l’estensione di un singolo buffer venga modificata. Inoltre per permettere alla memoria un ciclo di lettura più rapido, viene eseguita una cancellazione “virtuale” del buffer selezionato, che comporta la semplice scrittura di uno zero sul campo della lunghezza;. questo campo sarà testato ogni qual volta venga attivato un processo di scrittura sul buffer , per evitare la sovrascrittura di informazioni utili.

2.4.3 – Libreria Load/Save

Il codice di seguito descritto rappresenta una rielaborazione delle funzioni sviluppate dal Dott. Fiumana Mattia durante il progetto di tesi per la gestione e comunicazione di dati mediante interfaccia usb, fra il microcontrollore e Pc [15] . Si provvederà in un successivo accorpamento di tali funzionalità al progetto in esame; per incrementare le potenzialità.

Le funzioni in esame sono mediante selezionabili dall’utente mediante un opportuno menu di selezione implementato con un display LCD alfanumerico (Cap.3.1).

Load_Buffer

Lo scopo della funzione è l’esecuzione del caricamento della forma d’onda selezionata. Tale operazione avviene mediante il salvataggio del buffer selezionato in un array, creato appositamente e interno al microcontrollore; i dati così immagazzinati mantengono la formattazione originale (lunghezza, nome e valore dei campioni). La funzione di Load_Buffer viene eseguita prima dell’effettivo inizio della fase di caratterizzazione del dispositivo, non è quindi determinante a una prima analisi il tempo effettivo impiegato per eseguire la comunicazione.

void Load_mode(void){

unsigned int lunghezza; BYTE buf_select = choose(); __delay_ms(250);

lunghezza = read_word (0x0000, buf_select); int i;

for (i=0; i



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有